iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0

JWT 是什麼

JWT(JSON Web Token)用於在雙方之間安全地傳遞資料。它可以被用來表示用於身份驗證和資料交換的聲明。由於其緊湊和自包含的特性,特別適用於分佈式網站的場景,如單頁應用、身份驗證和跨域身份驗證。

JWT的主要用途:

  • 身份認證: 一旦用戶登錄,每次請求後續都將包括JWT,允許用戶訪問該令牌允許的路由、服務和資源。
  • 資料交換: JWT是一種在雙方之間安全地傳輸資料的方式,因為它可以被簽名,例如使用公鑰/私鑰對。

JWT 由三部分組成,並由點 (.) 分隔:

  1. 頭部 (Header): 通常包含兩部分:token的類型(即JWT)和所使用的哈希算法,如HMAC SHA256或RSA。
  2. 負載 (Payload): 負載包含聲明。聲明是關於實體(通常是用戶)和其他資料的語句。有三種類型的聲明:公共、私有和註冊。
  3. 簽名 (Signature): 為了創建JWT的第三部分,您需要將編碼的頭部、編碼的負載、秘密(secret)、頭部中指定的算法進行簽名。

當組合這三部分時,會得到一個由點分隔的字符串,如 aaaa.bbbb.cccc
範例:

eyJraWQiOiI5MTM2ZGRiMy1jYjBhLTRhMTktYTA3ZS1lYWRmNWE0NGM4YjUiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTY0ODAzNzE2NCwibmFtZSI6IkNhcmxvcyBNb250b3lhIiwic3ViIjoiY2FybG9zIiwicm9sZSI6ImJsb2dfYXV0aG9yIiwiZW1haWwiOiJjYXJsb3NAY2FybG9zLW1vbnRveWEubmV0IiwiaWF0IjoxNTE2MjM5MDIyfQ.SYZBPIBg2CRjXAJ8vCER0LA_ENjII1JakvNQoP-Hw6GG1zfl4JyngsZReIfqRvIAEi5L4HV0q7_9qGhQZvy9ZdxEJbwTxRs_6Lb-fZTDpW6lKYNdMyjw45_alSCZ1fypsMWz_2mTpQzil0lOtps5Ei_z7mM7M8gCwe_AGpI53JxduQOaB5HkT5gVrv9cKu9CsW5MS6ZbqYXpGyOG5ehoxqm8DL5tFYaW3lB50ELxi0KsuTKEbD0t5BCl0aCR2MBJWAbN-xeLwEenaqBiwPVvKixYleeDQiBEIylFdNNIMviKRgXiYuAvMziVPbwSgkZVHeEdF5MQP1Oe2Spac-6IfA

利用有缺陷的JWT簽名驗證

伺服器通常不會儲存有關其釋出的JWT的任何資訊。 相反,每個都是一個完全獨立的實體。 這有幾個優點,但也引入了一個根本問題——伺服器實際上對令牌的原始內容一無所知,甚至不知道原始簽名是什麼。 因此,如果伺服器沒有正確驗證簽名,就無法阻止攻擊者對他的其餘部分進行任意更改。

接受任意簽名

JWT庫通常提供一種方法來驗證令牌,另一種只是解碼它們。 例如, Node.js libraryjsonwebtoken 具有verify()decode()
有時候,開發者會混淆這兩種方法,只將傳入的令牌傳遞給decode()方法。 代表網站根本不會驗證簽名。

Lab time


上一篇
[Day 17]存取控制漏洞
下一篇
[Day 19]OAuth 漏洞
系列文
從 Moblie Development 主題被損友洗腦鬼轉 Security 的我真的可以完賽嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言